﻿using System;
using System.IO;
using System.Data;
using System.Windows;
using System.Collections;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using System.Collections.Generic;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.ImportacaoExportacao.Presenter;
using Sinacor.Infra.UI.Messaging.Internal;
using Sinacor.Infra.UI.Messaging.SmartClient;

namespace Sinacor.UI.Bovespa.ImportacaoExportacao.View.SmartClient
{
    /// <summary>
    /// Interaction logic for Importacoes.xaml
    /// </summary>
    public partial class Importacoes : SinacorWindow, IImportacaoExportacaoBase, IImportacaoNegocio
    {
        #region Atributos

        private WPFMessageManager _messageManager;

        #endregion

        #region Construtores

        public Importacoes(Model.Enum.TipoSistema tipoSistema)
        {
            Presenter.Importacoes presenterImportacoes;

            InitializeComponent();

            presenterImportacoes = new Presenter.Importacoes(this);
            presenterImportacoes.Filtro.TipoSistema = tipoSistema;
            presenterImportacoes.InicializarIdentificadoresArquivo();

            PresenterAtual = presenterImportacoes;
            this.DataContext = PresenterAtual;

            _messageManager = new WPFMessageManager();

            BtnImportarNEGR.Click += new RoutedEventHandler(BtnImportarNEGR_Click);
            BtnImportarNEGS.Click += new RoutedEventHandler(BtnImportarNEGS_Click);
            BtnImportarErroAlocaoComitentes.Click += new RoutedEventHandler(BtnImportarErroAlocaoComitentes_Click);
            BtnImportarTORDIST.Click += new RoutedEventHandler(BtnImportarTORDIST_Click);
            BtnCancelarNEGR.Click += new RoutedEventHandler(Cancelar_Click);
            BtnCancelarNEGS.Click += new RoutedEventHandler(Cancelar_Click);
            BtnCancelarErroAlocaoComitentes.Click += new RoutedEventHandler(Cancelar_Click);
            FlpArquivo.LostFocus += new RoutedEventHandler(FlpArquivo_LostFocus);
            FlpArquivo.FileSucessfullySelected += new SinacorFilePicker.FileSucessfullySelectedHandler(FlpArquivo_FileSucessfullySelected);
            RbtImportarTORDISTApelido.Checked += new RoutedEventHandler(RbtImportarTORDIST_Checked);
            RbtImportarTORDISTCliente.Checked += new RoutedEventHandler(RbtImportarTORDIST_Checked);
            RbtImportarTORDISTPercentual.Checked += new RoutedEventHandler(RbtImportarTORDIST_Checked);
            RbtImportarTORDISTQuantidade.Checked += new RoutedEventHandler(RbtImportarTORDIST_Checked);
            RbtImportarTORDISTVolume.Checked += new RoutedEventHandler(RbtImportarTORDIST_Checked);
            this.AfterInitialize += new RoutedEventHandler(Importacoes_AfterInitialize);
            this.Closing += new System.ComponentModel.CancelEventHandler(Importacoes_Closing);
            this.Closed += new EventHandler(Importacoes_Closed);
        }

        #endregion

        #region Propriedades

        public IImportacaoExportacaoPresenter PresenterAtual
        {
            get;
            set;
        }

        #endregion

        #region Event Handlers

        private void Importacoes_Closed(object sender, EventArgs e)
        {
            PresenterAtual.Dispose();
        }

        private void BtnImportarNEGR_Click(object sender, RoutedEventArgs e)
        {
            IniciarImportacao();
        }

        private void BtnImportarNEGS_Click(object sender, RoutedEventArgs e)
        {
            IniciarImportacao();
        }

        private void BtnImportarErroAlocaoComitentes_Click(object sender, RoutedEventArgs e)
        {
            IniciarImportacao();
        }

        private void BtnImportarTORDIST_Click(object sender, RoutedEventArgs e)
        {
            Model.Parameter.FiltroImportacaoDistribuicao filtro = (Model.Parameter.FiltroImportacaoDistribuicao)PresenterAtual.Filtro;

            if (RbtImportarTORDISTApelido.IsChecked.HasValue
                && RbtImportarTORDISTApelido.IsChecked.Value)
            {
                filtro.TipoDistribuicao = Model.Enum.TipoFormaDistribuicao.Apelido;
            }
            else if (RbtImportarTORDISTCliente.IsChecked.HasValue
                     && RbtImportarTORDISTCliente.IsChecked.Value)
            {
                filtro.TipoDistribuicao = Model.Enum.TipoFormaDistribuicao.Cliente;
            }
            else
            {
                filtro.TipoDistribuicao = null;
            }

            if (RbtImportarTORDISTPercentual.IsChecked.HasValue
                && RbtImportarTORDISTPercentual.IsChecked.Value)
            {
                filtro.TipoDistribuicaoPrecoMedio = Model.Enum.TipoDistribuicaoPrecoMedio.Percentual;
            }
            else if (RbtImportarTORDISTQuantidade.IsChecked.HasValue
                     && RbtImportarTORDISTQuantidade.IsChecked.Value)
            {
                filtro.TipoDistribuicaoPrecoMedio = Model.Enum.TipoDistribuicaoPrecoMedio.Quantidade;
            }
            else if (RbtImportarTORDISTVolume.IsChecked.HasValue
                     && RbtImportarTORDISTVolume.IsChecked.Value)
            {
                filtro.TipoDistribuicaoPrecoMedio = Model.Enum.TipoDistribuicaoPrecoMedio.Volume;
            }
            else
            {
                filtro.TipoDistribuicaoPrecoMedio = null;
            }

            IniciarImportacao();
        }

        private void Cancelar_Click(object sender, RoutedEventArgs e)
        {
            PresenterAtual.Cancelar();
        }

        private void Importacoes_AfterInitialize(object sender, RoutedEventArgs e)
        {
            AtualizarStatus();
        }

        private void FlpArquivo_LostFocus(object sender, RoutedEventArgs e)
        {
            if (e.OriginalSource is SinacorTextBox)
            {
                HabilitarImportacao((e.OriginalSource as SinacorTextBox).Text);
            }
        }

        private void FlpArquivo_FileSucessfullySelected(object sender, FileSucessfullySelectedEventArgs e)
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                HabilitarImportacao(e.SelectedFilePath);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        private void Importacoes_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (this.PresenterAtual.IsRunning)
            {
                SinacorMessageBoxResult result = SinacorMessageBox.Show(this.TryFindResource("Bovespa.ImportacaoExportacao.Message.ImpFecharTela").ToString(),
                    SinacorMessageBoxButton.YesNo,
                    SinacorMessageBoxImage.Question);

                if (result != SinacorMessageBoxResult.Yes)
                    e.Cancel = true;
            }
        }

        private void RbtImportarTORDIST_Checked(object sender, RoutedEventArgs e)
        {
            BtnImportarTORDIST.IsEnabled = true;
        }

        #endregion

        #region Métodos Privados

        private void HabilitarImportacao(string nomeArquivo)
        {
            PresenterAtual.DefinirTipoArquivo(nomeArquivo);

            PresenterAtual.LimparStatus();

            BtnImportarNEGR.IsEnabled = true;
            BtnImportarNEGS.IsEnabled = true;
            BtnImportarErroAlocaoComitentes.IsEnabled = true;
            BtnImportarTORDIST.IsEnabled = true;
        }

        private void IniciarImportacao()
        {
            if (FlpArquivo.Validate())
            {
                this.ClearServiceErrors();

                BtnImportarNEGS.IsEnabled = false;
                BtnImportarNEGR.IsEnabled = false;
                BtnImportarErroAlocaoComitentes.IsEnabled = false;
                BtnImportarTORDIST.IsEnabled = false;

                FlpArquivo.IsEnabled = false;

                PresenterAtual.Executar();
            }
        }

        private void AtivarImportacaoGenerica()
        {
            if (PresenterAtual.GetType() != typeof(Presenter.Importacoes))
            {
                TrocarPresenter(new Presenter.Importacoes(this, PresenterAtual.Filtro));
            }

            GrpImportarNEGR.Visibility = Visibility.Collapsed;
            GrpImportarNEGS.Visibility = Visibility.Collapsed;
            GrpImportarErroAlocaoComitentes.Visibility = Visibility.Collapsed;
            GrpImportarTORDIST.Visibility = Visibility.Collapsed;
        }

        private void AtivarImportacaoNEGR()
        {
            if (PresenterAtual.GetType() != typeof(Presenter.ImportacaoNegocio))
            {
                TrocarPresenter(new Presenter.ImportacaoNegocio(this, PresenterAtual.Filtro));
            }

            GrpImportarNEGR.Visibility = Visibility.Visible;
            GrpImportarNEGS.Visibility = Visibility.Collapsed;
            GrpImportarErroAlocaoComitentes.Visibility = Visibility.Collapsed;
            GrpImportarTORDIST.Visibility = Visibility.Collapsed;

            TxtImportarNEGRTipoArquivo.Text = this.FindResource("Bovespa.ImportacaoExportacao.Label.NEGR").ToString();
            TxtImportarNEGRDataPregao.UpdateTarget(SinacorTextBox.TextProperty);
        }

        private void AtivarImportacaoNEGS()
        {
            if (PresenterAtual.GetType() != typeof(Presenter.ImportacaoNegocio))
            {
                TrocarPresenter(new Presenter.ImportacaoNegocio(this, PresenterAtual.Filtro));
            }

            GrpImportarNEGR.Visibility = Visibility.Collapsed;
            GrpImportarNEGS.Visibility = Visibility.Visible;
            GrpImportarErroAlocaoComitentes.Visibility = Visibility.Collapsed;
            GrpImportarTORDIST.Visibility = Visibility.Collapsed;

            TxtImportarNEGSTipoArquivo.Text = this.FindResource("Bovespa.ImportacaoExportacao.Label.NEGS").ToString();
            TxtImportarNEGSCodigoCorrespondente.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            TxtImportarNEGSDataPregao.UpdateTarget(SinacorTextBox.TextProperty);
        }

        private void AtivarImportacaoErroAlocaoComitentes()
        {
            if (PresenterAtual.GetType() != typeof(Presenter.ImportacaoAlocacao))
            {
                TrocarPresenter(new Presenter.ImportacaoAlocacao(this, PresenterAtual.Filtro));
            }

            GrpImportarNEGR.Visibility = Visibility.Collapsed;
            GrpImportarNEGS.Visibility = Visibility.Collapsed;
            GrpImportarErroAlocaoComitentes.Visibility = Visibility.Visible;
            GrpImportarTORDIST.Visibility = Visibility.Collapsed;

            TxtImportarErroAlocaoComitentesTipoArquivo.Text = this.FindResource("Bovespa.ImportacaoExportacao.Label.EESC").ToString();
            TxtImportarErroAlocaoComitentesDataPregao.UpdateTarget(SinacorTextBox.TextProperty);
        }

        private void AtivarImportacaoTORDIST()
        {
            if (PresenterAtual.GetType() != typeof(Presenter.ImportacaoDistribuicao))
            {
                TrocarPresenter(new Presenter.ImportacaoDistribuicao(this, PresenterAtual.Filtro));
            }

            GrpImportarNEGR.Visibility = Visibility.Collapsed;
            GrpImportarNEGS.Visibility = Visibility.Collapsed;
            GrpImportarErroAlocaoComitentes.Visibility = Visibility.Collapsed;
            GrpImportarTORDIST.Visibility = Visibility.Visible;

            TxtImportarTORDISTTipoArquivo.Text = this.FindResource("Bovespa.ImportacaoExportacao.Label.TORDIST").ToString();
            TxtImportarTORDISTDataPregao.UpdateTarget(SinacorTextBox.TextProperty);
            ChkAcrescimoDescontoTORDIST.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            RbtImportarTORDISTApelido.IsChecked = false;
            RbtImportarTORDISTCliente.IsChecked = false;
            RbtImportarTORDISTVolume.IsChecked = false;
            RbtImportarTORDISTQuantidade.IsChecked = false;
            RbtImportarTORDISTPercentual.IsChecked = false;
        }

        private void TrocarPresenter(IImportacaoExportacaoPresenter presenterNova)
        {
            this.DataContext = null;
            PresenterAtual.Dispose();
            PresenterAtual = null;

            PresenterAtual = presenterNova;
            this.DataContext = PresenterAtual;
        }

        private void AlertarTelaConsultaErroComitentes()
        {
            InternalMessage message;
            System.Threading.Thread threadAbreTela;
            Alocacao.View.SmartClient.ConsultaErroComitentes form;

            bool achou = false;
            Sinacor.Infra.UI.Desktop.SmartClient.DesktopVirtual _virtualDesktop = Sinacor.Infra.UI.Desktop.SmartClient.DesktopVirtual.GetInstance();
            Type tipoTela = typeof(Alocacao.View.SmartClient.ConsultaErroComitentes);
            List<SinacorWindow> list = _virtualDesktop.GetDesktopVirtual(PresenterAtual.Session.TokenId);

            foreach (SinacorWindow window in list)
            {
                if (window.GetType() == tipoTela)
                {
                    window.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
                                                new Action(delegate()
                                                {
                                                    window.Activate();
                                                }));
                    achou = true;
                    break;
                }
            }

            if (!achou)
            {
                threadAbreTela = new System.Threading.Thread(delegate()
                {
                    form = new Alocacao.View.SmartClient.ConsultaErroComitentes();

                    if (PresenterAtual.Filtro.TipoSistema == Model.Enum.TipoSistema.Bolsa)
                    {
                        form.SetMenuHeader("Common.Menu.Label.BOL");
                    }
                    else
                    {
                        form.SetMenuHeader("Common.Menu.Label.ORD");
                    }

                    form.Show();
                    form.RunDispatcher();
                    form = null;
                });

                threadAbreTela.SetApartmentState(System.Threading.ApartmentState.STA);
                threadAbreTela.Start();
            }
            else
            {
                message = new InternalMessage();
                message.MessageId = "ABERTURAIMPORTACAOEESC";
                message.Message = this;

                _messageManager.SendMessage(message);
            }
        }

        #endregion

        #region IImportacaoBase Members

        public void AlterarPresenter(Model.Enum.TipoArquivo tipoArquivo)
        {
            switch (tipoArquivo)
            {
                case Model.Enum.TipoArquivo.Padrao:
                    AtivarImportacaoGenerica();
                    break;
                case Model.Enum.TipoArquivo.NEGR:
                    AtivarImportacaoNEGR();
                    break;
                case Model.Enum.TipoArquivo.NEGS:
                    AtivarImportacaoNEGS();
                    break;
                case Model.Enum.TipoArquivo.EESC:
                    AtivarImportacaoErroAlocaoComitentes();
                    break;
                case Model.Enum.TipoArquivo.TORDIST:
                    AtivarImportacaoTORDIST();
                    break;
            }
        }

        public void InformarImportacaoConcluida()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                FinalizarImportacao(false);

                SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.SucessoImportacao").ToString(),
                                       SinacorMessageBoxButton.Ok,
                                       SinacorMessageBoxImage.Information);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public void InformarExportacaoConcluida()
        {
            //Não é necessário pois é tela de importação
            throw new NotImplementedException();
        }

        public void InformarExportacaoConcluidaComErro()
        {
            //Não é necessário pois é tela de importação
            throw new NotImplementedException();
        }

        public void InformarImportacaoCancelada()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                FinalizarImportacao(true);

                SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.ImportacaoCancelada").ToString(),
                                       SinacorMessageBoxButton.Ok,
                                       SinacorMessageBoxImage.Exclamation);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public void InformarExportacaoCancelada()
        {
            //Não é necessário pois é tela de importação
            throw new NotImplementedException();
        }

        public void InformarErroImportacao()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                FinalizarImportacao(false);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public void InformarErroExportacao()
        {
            //Não é necessário pois é tela de importação
            throw new NotImplementedException();
        }

        public bool ConfirmarCancelamento()
        {
            bool retorno = (SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.ConfirmaCancelamentoOperacao").ToString(),
                                  SinacorMessageBoxButton.YesNo,
                                  SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes);

            if (retorno)
            {
                BtnCancelarErroAlocaoComitentes.IsEnabled = false;
                BtnCancelarNEGR.IsEnabled = false;
                BtnCancelarNEGS.IsEnabled = false;
                BtnCancelarTORDIST.IsEnabled = false;
                PgbProgresso.ProgressBarText = this.FindResource("Bovespa.ImportacaoExportacao.Label.ProcessandoCancelamento").ToString();
            }

            return retorno;
        }

        public bool ConfirmarImportacao()
        {
            return (SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.ConfirmaImportacao").ToString(),
                                  SinacorMessageBoxButton.YesNo,
                                  SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes);
        }

        public bool ConfirmarExportacao()
        {
            //Não é necessário pois é tela de importação
            throw new NotImplementedException();
        }

        public void InformarUsuarioSemPermissao()
        {
            FlpArquivo.UpdateTarget(SinacorFilePicker.ValueProperty);

            SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.UsuarioSemPermissaoImportacao").ToString(),
                                  SinacorMessageBoxButton.Ok,
                                  SinacorMessageBoxImage.Exclamation);
        }

        public void InformarArquivoInvalido()
        {
            FlpArquivo.UpdateTarget(SinacorFilePicker.ValueProperty);

            SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.ArquivoInvalido").ToString(),
                                   SinacorMessageBoxButton.Ok,
                                   SinacorMessageBoxImage.Exclamation);
        }

        public void AtualizarStatus()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                if (PresenterAtual.StatusProcesso.StartedAt == default(DateTime))
                {
                    TxtDataInicial.Text = "";
                    TxtHoraInicial.Text = "";
                }
                else
                {
                    TxtDataInicial.Text = PresenterAtual.StatusProcesso.StartedAt.ToString("d");
                    TxtHoraInicial.Text = PresenterAtual.StatusProcesso.StartedAt.ToString("t");
                }

                if (PresenterAtual.StatusProcesso.FinalizedAt == default(DateTime))
                {
                    TxtDataFinal.Text = "";
                    TxtHoraFinal.Text = "";
                }
                else
                {
                    TxtDataFinal.Text = PresenterAtual.StatusProcesso.StartedAt.ToString("d");
                    TxtHoraFinal.Text = PresenterAtual.StatusProcesso.StartedAt.ToString("t");
                }

                if (String.IsNullOrEmpty(PresenterAtual.StatusProcesso.Step))
                {
                    PgbProgresso.ProgressBarText = " ";
                }
                else
                {
                    PgbProgresso.ProgressBarText = FindResource(PresenterAtual.StatusProcesso.Step).ToString();
                }

                PgbProgresso.UpdateTarget(SinacorProgressBar.ValueProperty);
            });
        }

        public void HabilitarCancelamentoProcesso()
        {
            BtnCancelarErroAlocaoComitentes.IsEnabled = true;
            BtnCancelarNEGR.IsEnabled = true;
            BtnCancelarNEGS.IsEnabled = true;
            BtnCancelarTORDIST.IsEnabled = true;
        }

        public void DesabilitarCancelamentoProcesso()
        {
            BtnCancelarErroAlocaoComitentes.IsEnabled = false;
            BtnCancelarNEGR.IsEnabled = false;
            BtnCancelarNEGS.IsEnabled = false;
            BtnCancelarTORDIST.IsEnabled = false;
        }

        public void AtualizarListaCalendario()
        {
            //Não é necessário pois é tela de importação
            throw new NotImplementedException();
        }

        public void AtualizarListaTipoArquivo()
        {
            //Não é necessário pois é tela de importação
            throw new NotImplementedException();
        }

        public void FinalizarImportacao(bool botoesImportacaoLigados)
        {
            BtnCancelarErroAlocaoComitentes.IsEnabled = false;
            BtnCancelarNEGR.IsEnabled = false;
            BtnCancelarNEGS.IsEnabled = false;
            BtnCancelarTORDIST.IsEnabled = false;

            BtnImportarErroAlocaoComitentes.IsEnabled = botoesImportacaoLigados;
            BtnImportarNEGR.IsEnabled = botoesImportacaoLigados;
            BtnImportarNEGS.IsEnabled = botoesImportacaoLigados;
            BtnImportarTORDIST.IsEnabled = botoesImportacaoLigados;

            FlpArquivo.IsEnabled = true;

            RbtImportarTORDISTApelido.IsChecked = false;
            RbtImportarTORDISTCliente.IsChecked = false;
            RbtImportarTORDISTVolume.IsChecked = false;
            RbtImportarTORDISTQuantidade.IsChecked = false;
            RbtImportarTORDISTPercentual.IsChecked = false;
        }

        public void InformarDataInvalida()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.DataArquivoInvalida").ToString(),
                                  SinacorMessageBoxButton.Ok,
                                  SinacorMessageBoxImage.Exclamation);
        }

        #endregion

        #region IImportacaoNegocio Members

        public void InformarCorrespondenteObrigatorio()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.InformeCorrespondente").ToString(),
                                  SinacorMessageBoxButton.Ok,
                                  SinacorMessageBoxImage.Exclamation);
        }

        public bool ConfirmarImportacaoBrokersTORDIST(string brokers)
        {
            return SinacorMessageBox.Show(String.Format(this.FindResource("Bovespa.ImportacaoExportacao.Message.DesejaImportarBrokers").ToString(),
                                                        brokers),
                                          SinacorMessageBoxButton.YesNo,
                                          SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes;
        }

        public void InformarImportacaoConcluidaEESC()
        {
            this.Dispatcher.Invoke((Action)delegate()
                {
                    FinalizarImportacao(false);

                    if (SinacorMessageBox.Show(this.FindResource("Bovespa.ImportacaoExportacao.Message.ImpConcVisualizarEESC").ToString(),
                                                SinacorMessageBoxButton.YesNo,
                                                SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes)
                    {
                        AlertarTelaConsultaErroComitentes();
                    }
                },
                System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        #endregion
    }
}
